17.2 Brooksの間接バリア
全てのオブジェクト(from、to両方)に、to空間への転送先ポインタを書いておく
未コピー(from空間のオブジェクト)の転送先ポインタは自分自身を指す
オブジェクトのコピー時に、転送先ポインタをto空間の複製を指すように不可分に書き換える
複製(to空間のオブジェクト)の転送先ポインタは自分自身を指す
ミューテータスレッドは灰色でスタートし、動作する
code:17-2.py
# forwardingAddress は、今回はfrom空間のアドレスが返るかも。
# これまで見てきた通常のコピーGCにおけるforwardingAddressとは意味が異なる
# ここでのforwardingAddressの実装は、単に間接フィールドの値を返す
# forwardingAddressの定義変更により、17-1のコードに多少の変更は必要
def atomic Read(src, i):
src ← forwardingAddress(src)
def atomic Write(src, i, ref):
src ← forwardingAddress(src)
if isBlack(src) /* src はto 空間で境界の背後*/
# 黒色オブジェクトのポインタは
# to空間を指している必要があるので、
# Write時に黒色オブジェクトに書き込むなら、
# 書き込むポインタ(ref)をforwardしてto空間に飛ばしている。
ref ← forward(ref)
コピー完了時に(もしくは、より細かく、GCインクリメント終了時に)、スタック上やレジスタに残っていうるfrom空間を指したままの参照をto空間を指すように書き換える必要がある
書いてないけど、多分Brooksの手法もインクリメンタルGCが元で、それを拡張して並行コピーGCにしたのかな